﻿using LibNiconico.NiconicoApi.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LibNiconico.NiconicoApi.Utils
{

    

    /// <summary>
    /// ニコニコ取得結果
    /// </summary>
    public class NicoApiError 
    {
        private NicoApiError( NicoErrorCode resultcode,string baseCode, string description)
        {
            this.Code = resultcode;
            this.baseCode = baseCode;
            this.Description = description;
        }

        /// <summary>
        /// 結果コードの取得
        /// </summary>
        public NicoErrorCode Code
        {
            get;
            private set;
        }

        private string baseCode;



        /// <summary>
        /// 詳細
        /// </summary>
        public string Description
        {
            get;
            private set;
        }

        /// <summary>
        /// 変換されていないAPIからの結果コードを取得
        /// </summary>
        /// <returns></returns>
        public string GetBaseCode()
        {
            return baseCode;
        }

        internal static NicoApiError CreateFromResultCode(string resultCode)
        {
            switch (resultCode.ToLower())
            {
                case "":
                    return new NicoApiError( NicoErrorCode.None, resultCode, "エラーコードが設定されていません");

                case "closed":
                    return new NicoApiError( NicoErrorCode.Closed, resultCode, "放送が終了しています"); 

                case "notlogin":
                    return new NicoApiError(NicoErrorCode.NotLogin, resultCode, "ログインされていません");

                case "notfound":
                    return new NicoApiError(NicoErrorCode.NotFound, resultCode, "対象コンテンツが見つかりません");

                case "invalid_thread":
                    return new NicoApiError(NicoErrorCode.InvalidThread, resultCode, "有効なIDではありません");

                case "invalid_v1":
                    return new NicoApiError(NicoErrorCode.InvalidV1, resultCode, "有効なIDではありません");

                case "unknown_error":
                    return new NicoApiError(NicoErrorCode.UnknownError, resultCode, "不明なエラーです");

                case "unknown":
                    return new NicoApiError(NicoErrorCode.Unknown, resultCode, "不明なエラーです");

                case "maintenance":
                    return new NicoApiError(NicoErrorCode.Maintenance, resultCode, "ニコニコがメンテナンス中です");

                case "deleted":
                    return new NicoApiError(NicoErrorCode.Deleted, resultCode, "放送が削除されています");

                case "full":
                    return new NicoApiError(NicoErrorCode.Full, resultCode, "満員です");

                case "permission_denied":
                    return new NicoApiError(NicoErrorCode.PermissionDenied, resultCode, "接続が許可されていません");

                case "not_permitted":
                    return new NicoApiError(NicoErrorCode.NotPermitted, resultCode, "終了しているか、BANされています");

                case "require_community_member":
                    return new NicoApiError(NicoErrorCode.RequireCommunityMember, resultCode, "コミュニティ限定放送です");

                case "access_locked":
                    return new NicoApiError(NicoErrorCode.AccessLocked, resultCode, "許可されていないアクセスです");

                case "comingsoon":
                    return new NicoApiError(NicoErrorCode.ComingSoon, resultCode, "放送が開始されていません");

                case "require_accept_print_timeshift_ticket":
                    return new NicoApiError(NicoErrorCode.RequireAcceptPrintTimeShiftTicket, resultCode, "タイムシフト視聴権がありません");

                case "tsarchive":
                    return new NicoApiError(NicoErrorCode.TSArchive, resultCode, "有料放送のアーカイブのため視聴権がありません");

                case "usertimeshift":
                    return new NicoApiError(NicoErrorCode.UserTimeShift, resultCode, "非コミュニティメンバーのため視聴できません");

                default:
                    return new NicoApiError(NicoErrorCode.Undefined, resultCode, "不明なエラーコード " + resultCode + " が返されました");



            }
        }

    }

    /// <summary>
    /// ニコニコ取得結果コード
    /// </summary>
    public enum NicoErrorCode
    {
        /// <summary>
        /// 設定されていない
        /// </summary>
        None,

        /// <summary>
        /// 放送が閉じられている
        /// </summary>
        Closed,

        /// <summary>
        /// ログインしていない
        /// </summary>
        NotLogin,

        /// <summary>
        /// 放送が見つからない
        /// </summary>
        NotFound,

        /// <summary>
        /// 有効な放送ではない
        /// </summary>
        InvalidThread,

        /// <summary>
        /// 有効な放送ではない
        /// </summary>
        InvalidV1,

        /// <summary>
        /// 不明なエラー
        /// </summary>
        UnknownError,

        /// <summary>
        /// 不明なエラー
        /// </summary>
        Unknown,

        /// <summary>
        /// ニコニコがメンテナンス中
        /// </summary>
        Maintenance,

        /// <summary>
        /// 放送が削除されている
        /// </summary>
        Deleted,

        /// <summary>
        /// 放送が満員
        /// </summary>
        Full,

        /// <summary>
        /// 放送への接続が許可されていない
        /// </summary>
        PermissionDenied,

        /// <summary>
        /// 放送が終了しているかBANされている
        /// </summary>
        NotPermitted,

        /// <summary>
        /// 放送がコミュニティ現放送
        /// </summary>
        RequireCommunityMember,

        /// <summary>
        /// 放送へのアクセスが禁止されている
        /// </summary>
        AccessLocked,

        /// <summary>
        /// 放送が開始されていない
        /// </summary>
        ComingSoon,

        /// <summary>
        /// タイムシフト視聴権がない
        /// </summary>
        RequireAcceptPrintTimeShiftTicket,

        /// <summary>
        /// 有料放送アーカイブのため接続できない
        /// </summary>
        TSArchive,

        /// <summary>
        /// 非コミュニティメンバーのため視聴できない
        /// </summary>
        UserTimeShift,

        /// <summary>
        /// 未定義のエラーコード
        /// </summary>
        Undefined,

    }

   

    
}
